/*Copyright (C) 2009 - 2011 MASSART GAUTHIER

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "../headers.h"
short pui_IA_touche_aleatoire(short matrice[43]);
short pui_IA(short matrice[43]);
short pui_IA_attaque_def(short matrice[43]);
short pui_IA(short matrice[43]) {
	short touche_appuyee = 0;

	touche_appuyee = pui_IA_attaque_def(matrice);
	if(touche_appuyee == 0)
		touche_appuyee = pui_IA_touche_aleatoire(matrice);

	return touche_appuyee;
}

short pui_IA_attaque_def(short matrice[43]) {
	short i, j, k, l, init, verif = '2', touche_appuyee = 0, liste_verif2[3][5], liste_verif3[4][4];

	for(l = 0; l != 2; l++) {
		liste_verif2[0][0] = ' ', liste_verif2[0][1] = verif, liste_verif2[0][2] = verif, liste_verif2[0][3] = ' ', liste_verif2[0][4] = ' ';
		liste_verif2[1][0] = ' ', liste_verif2[1][1] = ' ', liste_verif2[1][2] = verif, liste_verif2[1][3] = verif, liste_verif2[1][4] = ' ';
		liste_verif2[2][0] = ' ', liste_verif2[2][1] = verif, liste_verif2[2][2] = ' ', liste_verif2[2][3] = verif, liste_verif2[2][4] = ' ';

		liste_verif3[0][0] = ' ', liste_verif3[0][1] = verif, liste_verif3[0][2] = verif, liste_verif3[0][3] = verif;
		liste_verif3[1][0] = verif, liste_verif3[1][1] = ' ', liste_verif3[1][2] = verif, liste_verif3[1][3] = verif;
		liste_verif3[2][0] = verif, liste_verif3[2][1] = verif, liste_verif3[2][2] = ' ', liste_verif3[2][3] = verif;
		liste_verif3[3][0] = verif, liste_verif3[3][1] = verif, liste_verif3[3][2] = verif, liste_verif3[3][3] = ' ';

		for(i = 0; i <= 3; i++) { // Bloque Horizontal fin
			for(j = 0; j <= 6; j++) {
				for(k = 0; k != 4; k++) {
					if(matrice[i*1 + j*7 + 1] == liste_verif3[k][0] && matrice[i*1 + j*7 + 2] == liste_verif3[k][1] && matrice[i*1 + j*7 + 3] == liste_verif3[k][2] && matrice[i*1 + j*7 + 4] == liste_verif3[k][3]) {
						touche_appuyee = 1 * i + j * 7 + k + 1;
						if(touche_appuyee < 36) { // Si on n'est pas sur la dernière ligne
							if(matrice[touche_appuyee+7] != ' ' && matrice[touche_appuyee-j*7] == ' ') { //Vérification que la case du dessous est bien pleine
								return (touche_appuyee - j * 7);
							}
						}
						else {
							return (touche_appuyee - j * 7);
						}
					}
				}
			}
		}

		for(i = 0; i <= 3; i++) {
			for(j = 0; j <= 2; j++) {
				for(k = 0; k != 4; k++) {// Bloque Diagonale fin '\'
					if(matrice[i*1 + j*7 + 1] == liste_verif3[k][0] && matrice[i*1 + (j+1)*7 + 2] == liste_verif3[k][1] && matrice[i*1 + (j+2)*7 + 3] == liste_verif3[k][2] && matrice[i*1 + (j+3)*7 + 4] == liste_verif3[k][3]) {
						touche_appuyee = 1 * i + (j + k) * 7 + k + 1;
						if(touche_appuyee < 36) { // Si on n'est pas sur la dernière ligne
							if(matrice[touche_appuyee+7] != ' ' && matrice[touche_appuyee-((j+k)*7)] == ' ') { //Vérification que la case du dessous est bien pleine
								return (touche_appuyee - ((j + k) * 7));
							}
						}
						else {
							return (touche_appuyee - ((j + k) * 7));
						}
					}
				}
				for(k = 0; k != 4; k++) { // Bloque Diagonale fin '/'
					if(matrice[i*1 + j*7 + 4] == liste_verif3[k][0] && matrice[i*1 + (j+1)*7 + 3] == liste_verif3[k][1] && matrice[i*1 + (j+2)*7 + 2] == liste_verif3[k][2] && matrice[i*1 + (j+3)*7 + 1] == liste_verif3[k][3]) {
						touche_appuyee = 1 * i + (j + k) * 7 + 4 - k;
						if(touche_appuyee < 36) { // Si on n'est pas sur la dernière ligne
							if(matrice[touche_appuyee+7] != ' ' && matrice[touche_appuyee-((j+k)*7)] == ' ') { //Vérification que la case du dessous est bien pleine
								return (touche_appuyee - ((j + k) * 7));
							}
						}
						else {
							return (touche_appuyee - ((j + k) * 7));
						}
					}
				}
			}
		}

		for(i = 0; i != 6; i++) {
			for(j = 0; j != 7; j++) {
				if(i <= 2) { // Verif verticale
					if(matrice[1 + j + (i*7)] == ' ' && matrice[8 + j + (i*7)] == verif && matrice[15 + j + (i*7)] == verif && matrice[22 + j + (i*7)] == verif) {
						touche_appuyee = j + 1;
						if(matrice[touche_appuyee] == ' ') {
							return touche_appuyee;
						}
					}
				}
			}
		}

		for(i = 0; i <= 3; i++) { // Empèche Horizontal point obligatoire
			for(j = 0; j <= 7; j++) {
				for(k = 0; k != 3; k++) {
					if(matrice[i*1 + j*7 + 1] == liste_verif2[k][0] && matrice[i*1 + j*7 + 2] == liste_verif2[k][1] && matrice[i*1 + j*7 + 3] == liste_verif2[k][2] && matrice[i*1 + j*7 + 4] == liste_verif2[k][3] && matrice[i*1 + j*7 + 5] == liste_verif2[k][4]) {
						touche_appuyee = 1 * i + j * 7 + 1;
						if(k == 0) {
							touche_appuyee += 3;
						}
						else if(k == 1) {
							touche_appuyee++;
						}
						else {
							touche_appuyee += 2;
						}
						if(touche_appuyee < 36) { // Si on n'est pas sur la dernière ligne
							if(matrice[1 * i + j * 7 + 1+7] != ' ' && matrice[1 * i + j * 7 + 1+7+1] != ' ' && matrice[1 * i + j * 7 + 1+7+2] != ' ' && matrice[1 * i + j * 7 + 1+7+3] != ' ' && matrice[1 * i + j * 7 + 1+7+4] != ' ' && matrice[touche_appuyee-j*7] == ' ') { //Vérification que la case du dessous est bien pleine
								return (touche_appuyee - j * 7);
							}
						}
						else {
							return (touche_appuyee - j * 7);
						}
					}
				}
			}
		}
		verif = '1';
	}
	return 0;
}

/*
** Si aucune des actions précédentes n'étaient nécéssaire, une case à remplire sera désigné aléatoirement
*/

short pui_IA_touche_aleatoire(short matrice[43]) {
	short aleatoir = 0, i;

	while(1) {
		aleatoir = random(1, 7);

		for(i = 6; matrice[i*aleatoir] != ' ' && i != 0; i--);

		if(matrice[i*aleatoir] == ' ') {
			return (i * aleatoir);
		}
	}
}
